home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / HDX350 / FMT.BAK < prev    next >
Encoding:
Text File  |  2001-02-09  |  8.5 KB  |  392 lines

  1. /* fmt.c */
  2.  
  3. #include "obdefs.h"
  4. #include "osbind.h"
  5. #include "mydefs.h"
  6. #include "part.h"
  7. #include "hdx.h"
  8. #include "addr.h"
  9. #include "error.h"
  10.  
  11. #define MFM 17            /* sectors per track of MFM */
  12. #define RLL 26            /* sectors per track of RLL */
  13.  
  14. extern long ostack;
  15. extern int typedev;
  16. extern int typedrv;
  17. extern char sbuf[];
  18.  
  19. /*
  20.  * These constants are used in a heuristic that determines
  21.  * if the format parameter information in the boot sector
  22.  * is intact.  (See fmtpok()).
  23.  */
  24. #define    MAXCYLS        4096        /* max number of cylinders */
  25. #define    MINCYLS        100        /* minimum number of cylinders */
  26. #define    MAXHEADS    16        /* max number of heads */
  27. #define    MINHEADS    2        /* minimum number of heads */
  28. #define    MAXLZ        16        /* max landing zone value */
  29. #define    MAXRT        2        /* max step-rate code */
  30.  
  31.  
  32. /*
  33.  * These are the default format parameters;
  34.  * they are for a 20Mb Mutsubuishi drive.
  35.  *
  36.  * @ If we change drives, this might have to be changed.
  37.  *
  38.  */
  39. HINFO deffmt = {
  40.     0x264,        /* 612 cylinders */
  41.     4,            /* 4 heads */
  42.     0x264,        /* no reduced write-current cylinder */
  43.     0x264,        /* no write precomp cylinder */
  44.     10,            /* landing zone position = 10 */
  45.     2,            /* 2 use buffered seeks */
  46.     1,            /* 2 interleave = 1 */
  47.     17            /* 17 sectors per track */
  48. };
  49.  
  50.  
  51. /*
  52.  * Report format error.
  53.  *
  54.  */
  55. formaterr(dev)
  56. int dev;
  57. {
  58.     char *pdev="X";
  59.     
  60.     if (dev > 7) dev -= 8;
  61.     *pdev = dev + '0';
  62.     (cantform[FMTDEV].ob_spec)->te_ptext = pdev;
  63.     cantform[FMTERROK].ob_state = NORMAL;
  64.     execform(cantform);
  65.     return ERROR;
  66. }
  67.  
  68.  
  69. /*
  70.  * Set format parameters in a
  71.  * root sector image.
  72.  * 6-13-88  only set size of hard disk.
  73.  *
  74.  */
  75.  
  76. sdisksiz(image, hdsiz)
  77. char *image;
  78. long hdsiz;
  79. {
  80.     ((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_siz = hdsiz;
  81.  
  82. }
  83.  
  84.  
  85. /*
  86.  * Set format parameters in a
  87.  * root sector image.
  88.  *
  89.  */
  90. sfmtparm(image, fmtparm)
  91. char *image;
  92. HINFO *fmtparm;
  93. {
  94.     register HINFO *rinfo;
  95.     register long siz;
  96.  
  97.     rinfo = &((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_info;
  98.     rinfo->hi_cc = fmtparm->hi_cc;
  99.     rinfo->hi_dhc = fmtparm->hi_dhc;
  100.     rinfo->hi_rwcc = fmtparm->hi_rwcc;
  101.     rinfo->hi_wpc = fmtparm->hi_wpc;
  102.     rinfo->hi_lz = fmtparm->hi_lz;
  103.     rinfo->hi_rt = fmtparm->hi_rt;
  104.     rinfo->hi_in = fmtparm->hi_in;
  105.     rinfo->hi_spt = fmtparm->hi_spt;
  106.  
  107.     /* Compute total disk size
  108.      * = <#cyls> * <#heads> * <#sectors / track>
  109.      */
  110.     ((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_siz = 
  111.         (long)fmtparm->hi_cc *
  112.         (long)fmtparm->hi_dhc *
  113.         (long)fmtparm->hi_spt; 
  114.  
  115. }
  116.  
  117.  
  118. /*
  119.  * Determine if format parameters are good;
  120.  * return OK if they appear to be,
  121.  * ERROR if they don't appear to be.
  122.  *
  123.  */
  124. fmtpok(fmtparm)
  125. HINFO *fmtparm;
  126. {
  127.     if (fmtparm->hi_cc > MAXCYLS ||
  128.     fmtparm->hi_cc < MINCYLS ||
  129.     fmtparm->hi_dhc > MAXHEADS ||
  130.     fmtparm->hi_dhc < MINHEADS ||
  131.     fmtparm->hi_lz > MAXLZ ||
  132.     fmtparm->hi_rt > MAXRT)
  133.         return ERROR;
  134.  
  135.     return OK;
  136. }
  137.  
  138.  
  139. /*
  140.  * Setup default format parameters in hinfo;
  141.  * (REAL C compilers do this with a structure assignment...)
  142.  *
  143.  */
  144. fdefault(hinfop)
  145. HINFO *hinfop;
  146. {
  147.     hinfop->hi_cc = deffmt.hi_cc;
  148.     hinfop->hi_dhc = deffmt.hi_dhc;
  149.     hinfop->hi_rwcc = deffmt.hi_rwcc;
  150.     hinfop->hi_wpc = deffmt.hi_wpc;
  151.     hinfop->hi_lz = deffmt.hi_lz;
  152.     hinfop->hi_rt = deffmt.hi_rt;
  153.     hinfop->hi_in = deffmt.hi_in;
  154.     hinfop->hi_spt = deffmt.hi_spt;
  155. }
  156.  
  157.  
  158. /*
  159.  * Set mode information on drive.
  160.  *
  161.  */
  162. ms(dev, hinfo)
  163. int dev;
  164. HINFO *hinfo;
  165. {
  166.     int i;
  167.     char *p;
  168.     SETMODE mb;
  169.     extern long mdselect();
  170.  
  171.     /* initialize parameter structure */
  172.     p = (char *)&mb;
  173.     for (i = sizeof(SETMODE); i--;)
  174.     *p++ = 0;
  175.     mb.smd_8 = 0x08;
  176.     mb.smd_1 = 0x01;
  177.     mb.smd_bs[1] = 0x02;    /* block size = 512 */
  178.  
  179.     cpw(&mb.smd_cc[0], hinfo->hi_cc);
  180.     mb.smd_dhc = hinfo->hi_dhc;
  181.     cpw(&mb.smd_rwc[0], hinfo->hi_rwcc);
  182.     cpw(&mb.smd_wpc[0], hinfo->hi_wpc);
  183.     mb.smd_lz = hinfo->hi_lz;
  184.     mb.smd_rt = hinfo->hi_rt;
  185.  
  186.     return (int)mdselect(dev, 22, &mb);
  187. }
  188.  
  189.  
  190. /*
  191.  * Move `w' to unaligned location.
  192.  *
  193.  */
  194. cpw(d, w)
  195. char *d;
  196. WORD w;
  197. {
  198.     char *s;
  199.  
  200.     s = (char *)&w;
  201.     d[0] = s[0];
  202.     d[1] = s[1];
  203. }
  204.  
  205.  
  206. /*
  207.  * Return format parameters in `hinfo', based on
  208.  * the format parameter name `fpnam'.
  209.  *
  210.  * return 0 on OK,
  211.  * -1 on [CANCEL].
  212.  *
  213.  */
  214. gfparm(dev, noinfo, modesel, hinfop, fpnam, id)
  215. int dev;
  216. int noinfo;            /* 1: no information inside the wincap file */
  217. int *modesel;
  218. HINFO *hinfop;
  219. char *fpnam, *id;
  220. {
  221.     long num;
  222.     char name[128];
  223.     int mask=0x0001;
  224.     int scsidrv, set, ret = OK;
  225.     UWORD cyl; 
  226.     BYTE nhead, sptrk;
  227.  
  228.     set = typedev & (mask << dev);
  229.     scsidrv = typedrv & (mask << dev);
  230.     fdefault(hinfop);
  231.     if ((set) || (scsidrv))        {
  232.         *modesel = 0;
  233.     } else if (noinfo)    {
  234.         ret = cyhdsp(dev, &cyl, &nhead, &sptrk);
  235.         hinfop->hi_cc = cyl;
  236.         hinfop->hi_dhc = nhead;
  237.         hinfop->hi_rwcc = cyl;
  238.         hinfop->hi_wpc =  cyl;
  239.         hinfop->hi_spt =  sptrk;
  240.     } else {
  241.  
  242.         strcpy(name, fpnam);
  243.         if (wgetent(fpnam, id) == ERROR) {
  244.             nofmt[NOSCHFOK].ob_state = NORMAL;
  245.             (nofmt[NOSCHFMT].ob_spec)->te_ptext = name;
  246.             execform(nofmt);
  247.             return ERROR;
  248.         }
  249.  
  250.         if (wgetnum("cy", &num) == OK) hinfop->hi_cc = (UWORD)num;
  251.         if (wgetnum("hd", &num) == OK) hinfop->hi_dhc = (BYTE)num;
  252.         if (wgetnum("rw", &num) == OK) hinfop->hi_rwcc = (UWORD)num;
  253.         if (wgetnum("wp", &num) == OK) hinfop->hi_wpc = (UWORD)num;
  254.         if (wgetnum("lz", &num) == OK) hinfop->hi_lz = (BYTE)num;
  255.         if (wgetnum("rt", &num) == OK) hinfop->hi_rt = (BYTE)num;
  256.         if (wgetnum("in", &num) == OK) hinfop->hi_in = (BYTE)num;
  257.         if (wgetnum("sp", &num) == OK) hinfop->hi_spt = (BYTE)num;
  258.         if (wgetnum("md", &num) == OK) *modesel = (UWORD)num;
  259.     }
  260.     return(ret);
  261. }
  262.  
  263.  
  264. /*
  265.  *    Set mode information on a SYQUEST drive.
  266.  *
  267.  */
  268.  
  269. sqms(dev, sendata)
  270. int dev;            /* physical device number */
  271. char sendata[];
  272. {
  273.     extern long mdselect();
  274.     char buf[32];
  275.  
  276.     inquiry(dev, (WORD)16, buf);
  277.     if (buf[8] == 'Q' & buf[9] == 'U' & buf[10] == 'A' & buf[11] == 'N') 
  278.         /* It is a QUANTUM hard disk. So don't need to set the page one. */
  279.         return OK;
  280.     sendata[0] = sendata[2] = 0;    /* reserved */
  281.     sendata[3] = 0x08;                /* block descriptor length */
  282.     sendata[12] = 0;                /* Reserved = 0; Page Code = 0 */
  283.     sendata[13] = 0x02;                
  284.     sendata[14] = 0x10;                /* set inhst bit in page 00 */
  285.     sendata[15] = 0;                /* Device type qualifier  */
  286.     return (int)mdselect(dev, 16, sendata);
  287. }
  288.  
  289.  
  290.  
  291.  
  292. /* 
  293.  * get cylinder, # of head, and sector per track for ST
  294.  */
  295.  
  296. cyhdsp(dev, cyl, nhead, sptk)
  297.  
  298. int dev;
  299. UWORD *cyl; 
  300. BYTE *nhead, *sptk;
  301.  
  302. {
  303.     char *num;
  304.     BYTE sptrk,numhead;
  305.     int i, ret, totcyl, numtrack;
  306.     extern long get3bytes();
  307.     SETMODE *mb;
  308.     SECTOR size, msiz;    /* size of media */
  309.     char buf[512], sendata[32];
  310.     long dmaptr, tmpptr, spcyl;
  311.     char *dmahigh=0xffff8609,
  312.          *dmamid=0xffff860b,
  313.          *dmalow=0xffff860d;
  314.  
  315.     for (i = 0; i < 22; i++)
  316.         sendata[i] = 0;
  317.     ostack = Super(NULL);
  318.     /* get format parameters/ disk size from emdia */
  319.     ret = mdsense(dev, 0, 0, 22, sendata);
  320.     delay();
  321.     Super(ostack);
  322.     if (ret != 0)     {
  323.         return ERROR;
  324.     }
  325.     for (i=0; i<22; i++)    {
  326.         if (sendata[i])
  327.             break;
  328.     }
  329.     if (i == 22)    /* no info return in the buf 'sendata' */
  330.         err(needinfo);
  331.  
  332.        get3bytes(sendata+5);  /* it's adaptec's.  Interpret as SETMODE structure */
  333.       mb = (SETMODE *)sendata;
  334.     /* get number of cylinders */
  335.     totcyl = mb->smd_cc[0];
  336.     totcyl <<= 8;
  337.     totcyl |= mb->smd_cc[1];
  338.     *cyl = (UWORD)totcyl;
  339.  
  340.     /* get number of heads */
  341.     numhead = mb->smd_dhc;
  342.     *nhead = numhead;
  343.   
  344.     sptrk = (long)MFM;
  345.     msiz = (SECTOR)numhead * (SECTOR)totcyl * sptrk;
  346.   
  347.     for (i = 0; i < 20; i++) {
  348.         if ((ret = rdsects(dev, 1, buf, msiz+i)) == OK) {
  349.  
  350.         /* find out whether data has been transferred, by
  351.               checking if dma pointer has been moved.      */
  352.  
  353.                ostack = Super(NULL);    /* get into Supervisor mode */
  354.       
  355.             dmaptr = *dmahigh;
  356.             dmaptr &= 0x0000003f;
  357.             dmaptr <<= 16;
  358.             tmpptr = *dmamid;
  359.             tmpptr &= 0x000000ff;
  360.             tmpptr <<= 8;
  361.             dmaptr |= tmpptr;
  362.             tmpptr = *dmalow;
  363.             tmpptr &= 0x000000ff;
  364.             dmaptr |= tmpptr;
  365.  
  366.             delay();
  367.             Super(ostack);        /* back to user mode */
  368.  
  369.             if (dmaptr != buf)
  370.                 break;
  371.            } else {            /* rdsects return an error */
  372.             if (tsterr(ret) == OK) {
  373.                     break;
  374.             }
  375.            }
  376.     }
  377.  
  378.     if (ret == MDMCHGD)        /* check if error occurred */
  379.         return err(cruptfmt);
  380.  
  381.     /* Determine if media is MFM or RLL */
  382.     if (i < 20)        {
  383.         *sptk = RLL;
  384.     } else {
  385.         *sptk = MFM;
  386.     }
  387.     return OK;
  388. }
  389.  
  390.  
  391.  
  392.